home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 March
/
EnigmA AMIGA RUN 05 (1996)(G.R. Edizioni)(IT)[!][issue 1996-03][Skylink CD IV].iso
/
earcd
/
demo
/
rotplnnr.lha
/
wbargs.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-21
|
4KB
|
136 lines
/* Copyright (c) 1993 SAS Institute, Inc, Cary, NC USA */
/* All Rights Reserved */
#include <workbench/startup.h>
#include <exec/execbase.h>
#include <string.h>
#include <dos.h>
#include <stdlib.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/icon.h>
/* These two symbols, _WBArgc and _WBArgv, are initialized if */
/* the program was invoked from WorkBench. They look like normal */
/* C (argc, argv) parameters. The parameters are gathered as */
/* follows: */
/* Name of the program */
/* Any tooltypes specified in the ToolTypes array */
/* Any icons supplied as arguments (with SHIFT-CLICK) */
int _WBArgc; /* Count of the number of WorkBench arguments */
char **_WBArgv; /* The actual arguments */
static int _WBArgMax; /* Internal: tells us how much space is left */
/* in _WBArgv. */
#define V37 (SysBase->LibNode.lib_Version >= 36)
// NAME: FullName
// PURPOSE: get the full pathname of a file.
// NOTES: Under AmigaDOS 2.0, use NameFromLock.
// Under 1.3, we should do this ourselves, but we just copy
// the incoming name over.
static void FullName(BPTR parent, char *name, char *buf, int len)
{
int i = 0;
struct ExecBase *SysBase = *(struct ExecBase **)4;
if(V37)
{
if(NameFromLock(parent, buf, len-1))
{
i = strlen(buf);
if(buf[i-1] != ':' && buf[i-1] != '/')
{
buf[i++] = '/';
buf[i] = 0;
}
}
}
if(i < len-1) strncpy(buf+i, name, len-i-1);
return;
}
/* Add an argument to the _WBArgv array. We must allocate */
/* memory for the argument and copy the incoming data. */
static int AddArg(char *arg)
{
if(_WBArgc >= _WBArgMax-1)
{
/* Out of space in _WBArgv. Reallocate it bigger. */
_WBArgMax += 10;
_WBArgv = realloc(_WBArgv, _WBArgMax*sizeof(char *));
if(_WBArgv == NULL) return -1;
}
/* Allocate memory for the new argument */
_WBArgv[_WBArgc] = malloc(strlen(arg)+1);
if(_WBArgv[_WBArgc] == NULL) return -1;
/* Copy the argument data over */
strcpy(_WBArgv[_WBArgc], arg);
/* Increment our argument count */
_WBArgc++;
return 0;
}
/* This is an autoinitializer routine that will be run if this */
/* module is linked in to user code. Referring to the external */
/* data items above is sufficient to pull this in from a library*/
int __stdargs _STI_20000_WBArgParse(void)
{
struct WBArg *wba;
int nargs;
char buf[512];
if(_WBenchMsg == NULL) return 0; // Not invoked from WorkBench
/* Put the program name in */
wba=_WBenchMsg->sm_ArgList;
FullName(wba->wa_Lock, wba->wa_Name, buf, sizeof(buf));
if(AddArg(buf)) return -1;
/* HACKED OUT -- chris
/* Find the tool types and add them */
if(IconBase = OpenLibrary("icon.library", 0L))
{
dir = CurrentDir(wba->wa_Lock);
if(dob = GetDiskObject(wba->wa_Name))
{
if(dob->do_ToolTypes)
{
for(nargs=0; dob->do_ToolTypes[nargs]; nargs++)
if(AddArg(dob->do_ToolTypes[nargs])) return -1;
}
FreeDiskObject(dob);
}
CurrentDir(dir);
CloseLibrary(IconBase);
}
*/
/* Now add the file arguments */
for(nargs=1, wba++;
nargs<_WBenchMsg->sm_NumArgs;
nargs++, wba++)
{
FullName(wba->wa_Lock, wba->wa_Name, buf, sizeof(buf));
if(AddArg(buf)) return -1;
}
/* Make sure _WBArgv is terminated with a NULL pointer */
/* like ANSI C argv lists are. */
_WBArgv[_WBArgc] = NULL;
return 0;
}